
/*
回溯
连接：https://leetcode.cn/problems/minesweeper/description/
题目：529. 扫雷游戏

模拟类型的 dfs 题⽬。
⾸先要搞懂题⽬要求，也就是游戏规则。
从题⽬所给的点击位置开始，根据游戏规则，来⼀次 dfs 即可。


  

   
    
*/
class Solution {
public:
    int m,n;
    int dx[8] = {0,0,1,-1,-1,-1,1,1};
    int dy[8] = {1,-1,0,0,-1,1,-1,1};
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
         m =board.size();
         n = board[0].size();
         int x = click[0];
         int y = click[1];
         if(board[x][y]=='M')
        {
            board[x][y]='X';
            return board;
        }
        dfs(board,x,y);
        return board;
    }
    void dfs(vector<vector<char>>& board,int i,int j)
    {
        int count=0;
        //统计地雷个数
        for(int k=0;k<8;k++)
        {
            int x = dx[k]+i;
            int y = dy[k]+j;
            if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='M')
                count++;
        }
        //有地雷
        if(count)
        {
            //停止递归，将当前位置更改为地雷个数
            board[i][j] = count+'0';
            return;
        }
        else
        {
            //没有地雷，递归展开
            board[i][j] = 'B';
            for(int k=0;k<8;k++)
            {
                int x = dx[k]+i;
                int y = dy[k]+j;
                if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='E')
                    dfs(board,x,y);
            }
        }
    }
};